home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / arbkeywd.c < prev    next >
C/C++ Source or Header  |  1996-05-26  |  17KB  |  759 lines

  1. /*
  2.  * ArbKeyWd.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Fonction de gestion des params mots clefs
  7.  *
  8.  * Notes:
  9.  * ------
  10.  *
  11.  * History:
  12.  * --------
  13.  * 14.03.95: fplanque: Created
  14.  * 29.03.95: changed specs
  15.  */
  16.  
  17.  
  18.      #include "!OPTIONS.H"                /* Options de compilation */         
  19.     #define    THIS_FILE    "ARBKEYWD.C v2.00 - 03.95"
  20.  
  21.  
  22. /*
  23.  * System headers:
  24.  */
  25.     #include    <stdio.h>
  26.     #include <stdlib.h>                    
  27.     #include    <string.h>                    /* Memcpy etc... */
  28.     #include    <aes.h>                        /* header AES */  
  29.     
  30. /*
  31.  * Custom headers:
  32.  */
  33.     #include "SPEC_PU.H"                    /* Listes... */    
  34.     #include "S_MALLOC.H"
  35.     #include    "DFSTRUCT.H"
  36.     #include    "FILES_PU.H"    
  37.     #include "ARBKEYPU.H"    
  38.     #include    "DEF_ARBO.H" 
  39.     #include "POPUP_PU.H"
  40.     #include "LISTS_PU.H"
  41.     #include "ARBGENPU.H"
  42.  
  43. /*
  44.  * Prototypes:
  45.  */
  46.     extern FNCTSPEC G_fnctlink[];    
  47.  
  48. /*
  49.  * Variables:
  50.  */
  51.     /*
  52.      * Popup de choix d'une action (mot clef)
  53.      */
  54.     POPUP_ENTRY    G_Popup_ActionMenu[]=
  55.     {                                
  56.         "  Aucune",                        ACTION_NONE,
  57.         "  Efface Ecran",                ACTION_CLS,
  58.         "  Efface Tout l'ecran",    ACTION_FULLCLS,
  59.         "  2 Bombes!!!",                ACTION_2BOMBES,
  60.         "  Efface Enregistrement",    ACTION_DEL_RECORD,
  61.         NULL,                                0xFFFF
  62.     };
  63.  
  64.  
  65. /*
  66.  *    --------------------- GESTION DE LISTES --------------------------
  67.  */
  68.  
  69. /*
  70.  * KeyWordLElt_Create(-)
  71.  *
  72.  * Purpose:
  73.  * --------
  74.  * Cr‚e un mot clef de liste
  75.  *
  76.  * 15.03.95: Created
  77.  * 29.03.95: Extended big time
  78.  */
  79. KEYWORD_LIST * KeyWordLElt_Create(        /* Out: Commande cr‚‚e */
  80.                         int        n_Event,        /* In:  Code ‚vŠnement */
  81.                         int        n_Action1,    /* In:  Action a entreprendre */
  82.                         int        n_Action2,    /* In:  Action a entreprendre */
  83.                         char    *    psz_Cmd,        /* In:  Commande … taper */
  84.                         char    *    psz_Dest )    /* In:  Page arbo destination */
  85. {
  86.     KEYWORD_LIST * pKeyWordLElt = MALLOC( sizeof( KEYWORD_LIST ) );
  87.     
  88.     pKeyWordLElt -> next = NULL;
  89.     pKeyWordLElt -> n_Event = n_Event;
  90.     pKeyWordLElt -> n_Action1 = n_Action1;
  91.     pKeyWordLElt -> n_Action2 = n_Action2;
  92.     pKeyWordLElt -> u_flags = 0;
  93.     pKeyWordLElt -> psz_KeyWord = psz_Cmd;
  94.     pKeyWordLElt -> psz_DestPage = psz_Dest;
  95.  
  96.     return    pKeyWordLElt;
  97. }
  98.  
  99.  
  100. /*
  101.  * CmdList_Replace1Content(-)
  102.  *
  103.  * Modifie les params d'un elt ds une liste de commandes
  104.  *
  105.  * 29.03.95: fplanque: created based on TextParList_Replace1Content
  106.  * 12.04.95: Corrected several bugs
  107.  */
  108. BOOL    CmdList_Replace1Content(            /* Out: TRUE_1 si ok */
  109.                 KEYWORD_LIST * pCmd_List,    /* In: Liste de Commandes */
  110.                 int                n_Event,        /* In: Code ‚vŠnement */
  111.                 int                n_Action1,    /* In: Action a entreprendre */
  112.                 int                n_Action2,    /* In: Action a entreprendre */
  113.                 char            *    psz_Cmd,        /* In: Commande … taper */
  114.                 char            *    psz_Dest )    /* In: Page arbo destination */
  115. {
  116.     KEYWORD_LIST *    pCmd_Found;
  117.     
  118.     /*
  119.      * Cherche par de fonction demand‚e:
  120.      */
  121.     pCmd_Found = Lookup_SingleLinkList( pCmd_List, n_Event );
  122.     if( pCmd_Found == NULL )
  123.     {
  124.         return    FALSE0;
  125.     }
  126.  
  127.     /*
  128.      * Trouv‚, remplace le nom:
  129.      */
  130.     pCmd_Found -> n_Action1 = n_Action1;
  131.     pCmd_Found -> n_Action2 = n_Action2;
  132.     free_String( pCmd_Found -> psz_KeyWord );
  133.     pCmd_Found -> psz_KeyWord = dup_String( psz_Cmd );
  134.     free_String( pCmd_Found -> psz_DestPage );
  135.     pCmd_Found -> psz_DestPage = dup_String( psz_Dest );
  136.     
  137.     return     TRUE_1;
  138. }            
  139.  
  140.  
  141.  
  142. /*
  143.  * KeyWordLElt_Destroy(-)
  144.  *
  145.  * D‚truit un mot clef de liste
  146.  *
  147.  * 16.03.95: Created
  148.  */
  149. void KeyWordLElt_Destroy(
  150.         KEYWORD_LIST * pKeyWordLElt ) /* In: Elt … d‚truire */
  151. {
  152.     free_String( pKeyWordLElt -> psz_KeyWord );
  153.     free_String( pKeyWordLElt -> psz_DestPage );
  154.  
  155.     FREE( pKeyWordLElt );
  156. }
  157.  
  158.  
  159.  
  160. /*
  161.  * findElt_KWLst_byIndex(-)
  162.  *
  163.  * Purpose:
  164.  * --------
  165.  * Trouve un elt ds une liste en fonction de son index
  166.  *
  167.  * History:
  168.  * --------
  169.  * 24.05.94: fplanque: Created
  170.  */
  171. KEYWORD_LIST *    findElt_KWLst_byIndex(     /* Out: Elt trouv‚ */
  172.             KEYWORD_LIST *    pDblTxt_List,    /* In:  Liste … parcourir */
  173.             int                 n_index )        /* In:  Index */
  174. {
  175.     int i;
  176.     KEYWORD_LIST * pDblTxt_elt = pDblTxt_List;
  177.     
  178.     for( i=0; i<n_index && pDblTxt_elt != NULL; i++ )
  179.     {
  180.         pDblTxt_elt = pDblTxt_elt -> next;
  181.     }
  182.  
  183.     /*
  184.      * Retourne ptr sur l'elt trouv‚:
  185.      */
  186.     return    pDblTxt_elt;
  187. }
  188.  
  189.  
  190. /*
  191.  * findElt_KWLst_by1stName(-)
  192.  *
  193.  * Purpose:
  194.  * --------
  195.  * Trouve un elt ds une liste en fonction de son 1er nom
  196.  *
  197.  * History:
  198.  * --------
  199.  * 24.05.94: fplanque: Created
  200.  */
  201. KEYWORD_LIST *    findElt_KWLst_by1stName(     
  202.             KEYWORD_LIST * pDblTxt_List,
  203.             const char     * cpsz_SearchString )
  204. {
  205.     KEYWORD_LIST * pDblTxt_elt = pDblTxt_List;
  206.     
  207.     while( pDblTxt_elt != NULL )
  208.     {
  209.         if( strcmp( pDblTxt_elt -> psz_KeyWord, cpsz_SearchString ) == 0 )
  210.         {    /*
  211.              * Retourne ptr sur l'elt trouv‚:
  212.              */
  213.             return    pDblTxt_elt;
  214.         }
  215.         pDblTxt_elt = pDblTxt_elt -> next;
  216.     }
  217.  
  218.     return    NULL;        /* Pas trouv‚ */
  219.  
  220. }
  221.  
  222.  
  223.  
  224. /*
  225.  * dup_KeyWordList(-)
  226.  *
  227.  * Purpose:
  228.  * --------
  229.  * Duplique une liste de params commandes
  230.  *
  231.  * History:
  232.  * --------
  233.  * 18.05.94: fplanque: Created based on dup_voies()
  234.  * 21.09.94: fplanque: Utilise dup_String()
  235.  * 15.03.95: appel de KeyWordLElt_Create()
  236.  * 29.03.95: extended
  237.  */
  238. KEYWORD_LIST    *dup_KeyWordList( 
  239.         const KEYWORD_LIST * pDblTxt_srce )
  240. {
  241.     KEYWORD_LIST  *    pDblTxt_dest1st;        /* 1er elt de la liste destination */
  242.     KEYWORD_LIST * *    lastptr_to_next = &pDblTxt_dest1st;    /* Adr du dernier ptr sur le champ suivant */
  243.     KEYWORD_LIST  *    pDblTxt_destCurr;        /* Elt courant de la liste destination */
  244.  
  245.     /*
  246.      * Copie tous les elts: 
  247.      */
  248.     while( pDblTxt_srce != NULL )
  249.     {
  250.         /*
  251.          * Cr‚e nouvel elt:
  252.          */
  253.         pDblTxt_destCurr = KeyWordLElt_Create( 
  254.                                         pDblTxt_srce -> n_Event,
  255.                                         pDblTxt_srce -> n_Action1,
  256.                                         pDblTxt_srce -> n_Action2,
  257.                                         dup_String( pDblTxt_srce -> psz_KeyWord ), 
  258.                                         dup_String( pDblTxt_srce -> psz_DestPage ) );
  259.  
  260.         /*
  261.          * Lie ce champ au pr‚c‚dent: 
  262.          */
  263.         *lastptr_to_next = pDblTxt_destCurr;
  264.  
  265.         /*
  266.          * Nouvelle adr du dernier ptr sur champ suivant: 
  267.          */
  268.         lastptr_to_next = &(pDblTxt_destCurr -> next);
  269.  
  270.         /*
  271.          * Passe au champ source suivant: 
  272.          */
  273.         pDblTxt_srce = pDblTxt_srce -> next;
  274.     }
  275.  
  276.  
  277.  
  278.     /*
  279.      * Signale fin de la liste: 
  280.      */
  281.     *lastptr_to_next = NULL;
  282.  
  283.     /*
  284.      * Retourne ptr sur nlle liste: 
  285.      */
  286.     return    pDblTxt_dest1st;
  287. }
  288.  
  289.  
  290.  
  291. /*
  292.  * CmdList_Create(-)
  293.  *
  294.  * Purpose:
  295.  * --------
  296.  * Cr‚e une liste de params commandes
  297.  *
  298.  * History:
  299.  * --------
  300.  * 29.03.95: fplanque: Created
  301.  * 21.09.94: fplanque: Utilise dup_String()
  302.  * 15.03.95: appel de KeyWordLElt_Create()
  303.  * 29.03.95: extended
  304.  */
  305. KEYWORD_LIST    *CmdList_Create( 
  306.                         const KEYWORD_LIST * pKWElt_srce )
  307. {
  308.     KEYWORD_LIST  *    pDblTxt_dest1st;        /* 1er elt de la liste destination */
  309.     KEYWORD_LIST * *    lastptr_to_next = &pDblTxt_dest1st;    /* Adr du dernier ptr sur le champ suivant */
  310.     KEYWORD_LIST  *    pDblTxt_destCurr;        /* Elt courant de la liste destination */
  311.     int                     i;
  312.  
  313.     for( i=0; pKWElt_srce[i] .n_Event != NIL; i++ )
  314.     {    /*
  315.          * Cr‚e nouvel elt:
  316.          */
  317.         pDblTxt_destCurr = KeyWordLElt_Create( 
  318.                                         pKWElt_srce[i] .n_Event,
  319.                                         pKWElt_srce[i] .n_Action1,
  320.                                         pKWElt_srce[i] .n_Action2,
  321.                                         dup_String( pKWElt_srce[i] .psz_KeyWord ), 
  322.                                         dup_String( pKWElt_srce[i] .psz_DestPage ) );
  323.  
  324.         /*
  325.          * Lie ce champ au pr‚c‚dent: 
  326.          */
  327.         *lastptr_to_next = pDblTxt_destCurr;
  328.         /*
  329.          * Nouvelle adr du dernier ptr sur champ suivant: 
  330.          */
  331.         lastptr_to_next = &(pDblTxt_destCurr -> next);
  332.     }
  333.  
  334.     /*
  335.      * Signale fin de la liste: 
  336.      */
  337.     *lastptr_to_next = NULL;
  338.  
  339.     /*
  340.      * Retourne ptr sur nlle liste: 
  341.      */
  342.     return    pDblTxt_dest1st;
  343. }
  344.  
  345.  
  346. /*
  347.  * free_KeyWordList(-)
  348.  *
  349.  * Purpose:
  350.  * --------
  351.  * LibŠre: efface une liste chain‚e de la m‚moire
  352.  *
  353.  * Notes:
  354.  * ------
  355.  * attentions aux cas G_empty
  356.  *
  357.  * History:
  358.  * --------
  359.  * 24.05.94: fplanque: Created
  360.  * 16.03.95: appel de KeyWordLElt_Destroy()
  361.  */
  362. void    free_KeyWordList(     
  363.             KEYWORD_LIST * pDblTxt_List )
  364. {
  365.     KEYWORD_LIST * pDblTxt_CurrElt = pDblTxt_List;
  366.     KEYWORD_LIST * pDblTxt_NextElt;
  367.  
  368.     while( pDblTxt_CurrElt != NULL )
  369.     {
  370.         pDblTxt_NextElt = pDblTxt_CurrElt -> next;
  371.  
  372.         KeyWordLElt_Destroy( pDblTxt_CurrElt );
  373.         
  374.         pDblTxt_CurrElt = pDblTxt_NextElt;
  375.     }
  376. }
  377.  
  378.  
  379.  
  380. /*
  381.  * cree_ligne_KeyWord(-)
  382.  *
  383.  * Purpose:
  384.  * --------
  385.  * Cr‚e une ligne d'infos sur un elt de liste KEYWORD_LIST
  386.  * pour l'ins‚rer ds liste 
  387.  *
  388.  * History:
  389.  * --------
  390.  * 18.05.94: fplanque: Created based on cree_ligne_voie()
  391.  * 15.03.95: on recommence tout
  392.  * 12.04.95: enhanced
  393.  */
  394. char * cree_ligne_KeyWord(                     /* Out: Ligne de texte g‚n‚r‚e */
  395.             KEYWORD_LIST *    pDblText_curr,        /* In:  Elt de liste … transformer en ligne */
  396.             BOOL                b_MotClef )            /* In:  True s'il s'agit d'un mot clef */
  397. {
  398.     size_t    st_len;
  399.     const    char    *    cpsz;
  400.  
  401.     const size_t    st_LongMotClef    = 14;    /* In:  Long max du champ mot clef */
  402.     const size_t    st_LongAction    = 14;    /* In:  Long max du champ action */
  403.     const size_t    st_LongTotale    = 43;    /* In:  Long totale */
  404.  
  405.     /*
  406.      * Init buffer de composition:
  407.      */
  408.     memset( G_tmp_buffer, ' ', st_LongTotale );
  409.  
  410.     if( b_MotClef )
  411.     {    /*
  412.          * Mot clef:
  413.          */
  414.         cpsz = pDblText_curr -> psz_KeyWord;
  415.     }
  416.     else
  417.     {    /*
  418.          * Touche press‚e:
  419.          */
  420.         cpsz = fnct_spec( G_fnctlink, pDblText_curr -> n_Event ) -> fnct_name;
  421.     }
  422.     st_len = len_String( cpsz );
  423.     copy_String( G_tmp_buffer, cpsz );
  424.     G_tmp_buffer[ st_len ] = ' ';
  425.     G_tmp_buffer[ st_LongMotClef-1 ] = ' ';
  426.  
  427.     /*
  428.      * Action:
  429.      */
  430.     cpsz = get_popup_name( G_Popup_ActionMenu, pDblText_curr-> n_Action1 );
  431.     st_len = len_String( cpsz );
  432.     copy_String( G_tmp_buffer + st_LongMotClef, cpsz );
  433.     G_tmp_buffer[ st_LongMotClef + st_len ] = ' ';
  434.     G_tmp_buffer[ st_LongMotClef + st_LongAction -1 ] = ' ';
  435.     
  436.     /*
  437.      * Destination:
  438.      */
  439.     cpsz = pDblText_curr -> psz_DestPage;
  440.     st_len = len_String( cpsz );
  441.     copy_String( G_tmp_buffer + st_LongMotClef + st_LongAction, cpsz );
  442.     G_tmp_buffer[ st_LongMotClef + st_LongAction + st_len ] = '\0';
  443.  
  444.     /*
  445.      * Fin de chaŒne:
  446.      */
  447.     G_tmp_buffer[ st_LongTotale ] = '\0';
  448.  
  449.     /*
  450.      * Sauve chaine dans tableau:
  451.      */        
  452.     return    STRDUP( G_tmp_buffer );
  453. }
  454.  
  455.  
  456.  
  457. /*
  458.  * cree_liste_KeyWord(-)
  459.  *
  460.  * Purpose:
  461.  * --------
  462.  * Creation d'une liste de descripteurs textuels
  463.  * sous forme de tableau de ptrs sur strings
  464.  * correspondant … une liste chain‚e de type KEYWORD_LIST
  465.  *
  466.  * Algorythm:
  467.  * ----------  
  468.  * appelle cree_ligne_KeyWord() pour chaque ligne
  469.  *
  470.  * Notes:
  471.  * ------
  472.  * Si nb_lignes = 0, on alloue qd mˆme un tableau de taille nulle.
  473.  *
  474.  * History:
  475.  * --------
  476.  * 18.05.94: fplanque: Created
  477.  * 12.04.95: enlev‚ parametres de longueur, ajout‚ b_Command
  478.  */
  479. int    cree_liste_KeyWord(                         /* Out: Nbre de lignes dans la liste */
  480.             KEYWORD_LIST *    pDblText_First,    /* In:  Ptr sur 1er elt de liste chain‚e */
  481.             BOOL                b_Command,            /* In:  TRUE s'il s'agit de commandes, non pas d'ebents */
  482.             char         * * *    pTpS_lignes )        /* Out: Ptr sur Tableau de ptrs sur strings */
  483. {
  484.     KEYWORD_LIST *    pDblText_curr = pDblText_First;
  485.     char             * *    TpS_lignes;            /* Tableau contenant les lignes */
  486.     int                     nb_lignes = 0;
  487.     int                    i;
  488.  
  489.     /* 
  490.      * Compte lignes: 
  491.      */
  492.     while( pDblText_curr != NULL )
  493.     {
  494.         nb_lignes ++;                        /* 1 ligne de plus */
  495.         pDblText_curr = pDblText_curr -> next;
  496.     }
  497.  
  498.  
  499.     /*
  500.      * Cr‚e zones de stockage: 
  501.      */
  502.     TpS_lignes = (char * *) MALLOC( sizeof( char* ) * nb_lignes );
  503.  
  504.     /* 
  505.      * Remplit tableau: 
  506.      */
  507.     pDblText_curr = pDblText_First;        /* Commence sur 1Šre page ‚cran de la page arbo */
  508.     for ( i=0; i<nb_lignes; i++ )
  509.     {
  510.         /*
  511.          * Cr‚e chaine et la Sauve dans tableau:
  512.          */        
  513.         TpS_lignes[ i ] = cree_ligne_KeyWord( pDblText_curr, b_Command );
  514.     
  515.         /*
  516.          * Elt de liste suivant: 
  517.          */
  518.         pDblText_curr = pDblText_curr -> next;
  519.     }
  520.  
  521.     /*
  522.      * Valeurs en retour: 
  523.      */
  524.     *pTpS_lignes = TpS_lignes;
  525.  
  526.     return    nb_lignes;
  527.     
  528. }
  529.  
  530.  
  531. /*
  532.  * detruit_listeTpS(-)
  533.  *
  534.  * Purpose:
  535.  * --------
  536.  * Destruction d'une liste sous forme de tableau de ptrs sur strings
  537.  *
  538.  * Notes:
  539.  * ------
  540.  * G_empty_string est utilis‚ pour les chaines vides et ne doit
  541.  * pas ˆtre d‚sallou‚ (FREE())
  542.  *
  543.  * History:
  544.  * --------
  545.  * 18.05.94: fplanque: Created
  546.  */
  547. void    detruit_listeTpS(         
  548.             char * *    TpS_lignes,            /* In: Tableau de ptrs sur strings */
  549.             int        nb_lignes )            /* In: Nbre de lignes ds le tableau */
  550. {
  551.     int i;
  552.     
  553.     /*
  554.      * LibŠre les strings:
  555.      */
  556.     for ( i=0; i<nb_lignes; i++ )
  557.     {
  558.         if( TpS_lignes[ i ] != G_empty_string )
  559.         {    /* 
  560.              * S'il y a un string … effacer: 
  561.              */
  562.             FREE( TpS_lignes[ i ] );
  563.         }
  564.     }
  565.  
  566.     /*
  567.      * LibŠres la zone de stockage du tableau: 
  568.      */
  569.     FREE( TpS_lignes );
  570. }
  571.  
  572.  
  573.  
  574. /*
  575.  * load_motsclefs(-)
  576.  *
  577.  * Purpose:
  578.  * --------
  579.  * Charge mots clefs relatifs … une page arbo
  580.  *
  581.  * Notes:
  582.  * ------
  583.  *
  584.  * History:
  585.  * --------
  586.  * 24.05.94: fplanque: Created
  587.  * 15.03.95: appel de KeyWordLElt_Create()
  588.  * 29.03.95: extended
  589.  * 08.04.95: petites modifs
  590.  */
  591. KEYWORD_LIST * load_motsclefs( 
  592.                         FILE    *    fstream,        /* In: fichier ds lequel on lit */
  593.                         CMD_KIND    CmdKind,        /* In: type de donn‚es */
  594.                         int        n_Version )    /* In: Version du fichier */
  595. {
  596.     size_t            load_res;            /* R‚sultat de l'op‚ration de chargement */
  597.     KEYWORD_LIST *    p_first;                /* 1er paramŠtre */
  598.     KEYWORD_LIST **pp_lastnext = &p_first;    /* Adr Ptr sur prochain ds le pr‚c‚dent */
  599.     KEYWORD_LIST *    p_current;            /* Param courant */
  600.     char             * psz_Cmd = NULL;
  601.     char             * psz_Dest;
  602.     UINT                u_Event;
  603.     int                n_Action1;
  604.     int                n_Action2;
  605.     UINT                u_flags;
  606.  
  607.     /*
  608.      * Mots clefs: 
  609.      */
  610.     while
  611.     ( 
  612.         load_res = fread( &u_Event, sizeof( unsigned ), 1, fstream ),
  613.         load_res == 1 /*PasFinFichier*/  &&  u_Event != 0xFFFF /*PasFinListe*/
  614.     )
  615.     {    /*
  616.          * Tant qu'il y a des trucs … charger: 
  617.          */
  618.         if( n_Version < 0x0005 )
  619.         {    /*
  620.              * Anciens formats:
  621.              */
  622.             n_Action1 = ACTION_NONE;
  623.             n_Action2 = ACTION_NONE;
  624.             u_flags     = 0;                        /* 08.04.95 */
  625.  
  626.             if( CmdKind == CMD_KEYWORD )
  627.             {    /*
  628.                  * Mot clef:
  629.                  */
  630.                 u_Event = FL_ENVOI;    /* Par d‚faut, l'evt est ENVOI */
  631.     
  632.                 psz_Cmd  = load_String( fstream );
  633.                 if( n_Version >= 0x004 )
  634.                 {
  635.                     fread( &n_Action1, sizeof( n_Action1 ), 1, fstream );
  636.                 }
  637.                 else
  638.                 {
  639.                     n_Action2 = ACTION_FULLCLS;
  640.                 }
  641.             }
  642.             else
  643.             {    /*
  644.                  * si lien arbo ancien format, pas de donn‚es compl‚mentaires
  645.                  * … charger... mais:
  646.                  */
  647.                 n_Action2 = ACTION_FULLCLS;
  648.             }
  649.             
  650.             /*
  651.              * Charge destination:
  652.              */
  653.             psz_Dest = load_String( fstream );
  654.         }
  655.         else
  656.         {    /*
  657.              * Nouveau formats (v0.05):
  658.              * u_Event est d‚j… charg‚!
  659.              */
  660.             fread( &n_Action1, sizeof( n_Action1 ), 1, fstream );
  661.             fread( &n_Action2, sizeof( n_Action2 ), 1, fstream );
  662.             fread( &u_flags,   sizeof( u_flags ),   1, fstream );
  663.             psz_Cmd = load_String( fstream );
  664.             psz_Dest = load_String( fstream );
  665.         }
  666.         
  667.         /*
  668.          * Cr‚e le mot clef: 
  669.          */
  670.         p_current = KeyWordLElt_Create( u_Event, n_Action1, n_Action2, psz_Cmd, psz_Dest );
  671.         
  672.         /*
  673.          * Liaison avec le pr‚c‚dent: 
  674.          */
  675.         *pp_lastnext = p_current;    /* Indique adresse du MC courant */
  676.  
  677.         /*
  678.          * Sauve adresse du ptr dans lequel il va falloir placer l'adr du param suivant: 
  679.          */
  680.         pp_lastnext = &( p_current -> next );            
  681.     }
  682.  
  683.     /*
  684.      * Signale fin de la liste: 
  685.      */
  686.     *pp_lastnext = NULL;        /* Plus de MC aprŠs */
  687.  
  688.     /*
  689.      * Contr“le si le chargement est ok: 
  690.      */
  691.     if( u_Event != 0xFFFF )
  692.     {    /*
  693.          * S'il y a eu un problŠme: 
  694.          * Efface le d‚but de liste: 
  695.          */
  696.         free_KeyWordList( p_first );
  697.         p_first = NULL;    /* Plus de liste */
  698.     }
  699.  
  700.     /* 
  701.      * Renvoie l'adresse du 1er mot clef: 
  702.      */
  703.     return    p_first;
  704. }
  705.  
  706.  
  707.  
  708.  
  709. /*
  710.  * save_motsclef(-)
  711.  *
  712.  * Purpose:
  713.  * --------
  714.  * Sauve les mots clefs
  715.  *
  716.  * Notes:
  717.  * ------
  718.  *
  719.  * History:
  720.  * --------
  721.  * 24.05.94: fplanque: Created
  722.  * 31.03.95: format de fichier v0.05
  723.  */
  724. void    save_motsclef( 
  725.             FILE                  *    fstream,
  726.             KEYWORD_LIST    *    p_MotsClefs )
  727. {
  728.     /*
  729.      * Sauve mots clefs: 
  730.      */
  731.     while( p_MotsClefs != NULL )
  732.     {    /* 
  733.          * Tant qu'il y a des mots-clefs … sauver 
  734.           * Sauve event, action et flags: 
  735.           */
  736.         fwrite( &(p_MotsClefs -> n_Event), sizeof(int) * 3 + sizeof(UINT), 1, fstream );
  737.         /*
  738.          * Sauve mot clef:
  739.          */
  740.         save_String( p_MotsClefs -> psz_KeyWord, fstream );    /* Sauve texte */
  741.         /*
  742.          * Sauve destination: 
  743.          */
  744.         save_String( p_MotsClefs -> psz_DestPage, fstream );    /* Sauve texte */
  745.  
  746.         /*
  747.          * Passe au paramŠtre suivant: 
  748.          */
  749.         p_MotsClefs = p_MotsClefs -> next;
  750.     }
  751.  
  752.     /*
  753.      * Fin de la liste: 
  754.      */
  755.     fputc( 0xFF, fstream );        /* Ajoute 0xFFFF pour signaler */
  756.     fputc( 0xFF, fstream );        /* La fin de la liste */
  757. }
  758.  
  759.